package com.xl.juc.ThreadPool;

import java.util.concurrent.*;

/**
 * 七大参数  4中拒绝策略
 *
 * 1.  new ThreadPoolExecutor.AbortPolicy()·默认策略；新任务提交时直接抛出未检查的异常RejectedExecutionException
 * 2. new ThreadPoolExecutor.DiscardPolicy() 队列满了，丢掉新任务，不抛异常
 * 3.  new ThreadPoolExecutor.DiscardOldestPolicy() 队列满了，调用poll方法丢弃工作队列队头的任务，然后尝试提交新任务
 * 4.  new ThreadPoolExecutor.CallerRunsPolicy());//当队列满了，既不抛弃任务也不抛出异常，使用调用者所在线程运行新的任务
 * @author Charley
 * @create 2021-01-24
 */
public class ThreadPoolExecutorDemo {
    /**
     *  ThreadPoolExecutor(int corePoolSize,//核心线程数
         int maximumPoolSize,//最多的线程数
         long keepAliveTime,//线程最大的存活时间，超时了没人使用就会释放
         TimeUnit unit,//存活单位
         BlockingQueue<Runnable> workQueue,//阻塞队列
         ThreadFactory threadFactory,//线程工厂；创建线程的
         RejectedExecutionHandler handler)//拒绝策略
     * @param args
     */
    public static void main(String[] args) {
      //线程数最多为5 队列最多为3

        //问题：线程池的最大线程数如何确定？
        /**
         * 1.CPU密集型 ，几核就设置几 ，可以保持cpu的效率最高
         * 2.IO 密集型 大于判断你程序中十分耗IO的线程数  比如程序 15个大型任务 io十分占用资源  就设置30
         */
        //获取cpu核数
        System.out.println("cpu核数:"+Runtime.getRuntime().availableProcessors());
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.CallerRunsPolicy());//当队列满了，既不抛弃任务也不抛出异常，使用调用者所在线程运行新的任务
        // （使用main 线程执行任务）

        try {
            for (int i = 1; i <=12 ; i++) {
                threadPoolExecutor.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPoolExecutor.shutdown();
        }
    }
}
